#ifndef __TIMER_DOT_HPP__
#define __TIMER_DOT_HPP__
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
#include <time.h>
#include <stdint.h>
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// #define __MAC_OSX__
#ifdef  __MAC_OSX__
#define CLOCK_MONOTONIC          0
#define CLOCK_PROCESS_CPUTIME_ID 0
#define CLOCK_THREAD_CPUTIME_ID  0
#include <mach/mach_time.h>
void clock_gettime( const uint32_t unused, timespec * tsp );
#endif
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
class Timer {
    double count;
    double accumTime;
    double dt;
    timespec tstart;
    timespec tstop;
    void TimeDiff( void );
public:
    inline void Start( void ) {
        clock_gettime( CLOCK_MONOTONIC, &tstart );
    }
    void Stop( void ) {
        clock_gettime( CLOCK_MONOTONIC, &tstop );
        TimeDiff();
        count     += 1.0;
        accumTime += dt;
    }
    inline double TotalTime( void ) const {
        return accumTime;
    }
    inline double DeltaTime( void ) const {
        return dt;
    }
    inline double AvgTime( void ) const {
        return accumTime / count;
    }
    inline uint64_t Count( void ) const {
        return uint64_t( count );
    }
    void Reset( void ) {
        count     = 0.0;
        dt        = 0.0;
        accumTime = 0.0;        
    }
    Timer( void ) {
        Reset();
    }
};
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
#endif

